# -*- coding: utf-8 -*-
# author: sixmillions
# date: 2022/3/26

# 参数说明

######
# 1. 必须参数
######
def add(x, y):
    return x + y


print("----------------------")

# 调用add，x，y必须传，不传报错
res = add(1, 2)
print(1, res)  # 3
# res = add(1)

print("----------------------")

######
# 2. 关键字参数
######
# 上面是顺序赋值，如果我们使用具体参数名，就可以不按照定义顺序
res = add(y=3, x=4)
print(2, res)  # 7

print("----------------------")


######
# 3. 默认参数，默认的参数后面不能有必须参数
######
def print_student_info(name, age=18, gender='男', college='北大'):
    print("我的名字是：" + name)
    print("我的年龄是：" + str(age))
    print("我的性别是：" + gender)
    print("我的大学是：" + college)


print_student_info('张三', 17, '男', '清华')
print("----------------------")
# 指定必传
print_student_info('李四')
print("----------------------")
# 指定部分
print_student_info('王五', gender='女')
print("----------------------")
print_student_info('陈小六', age='26', college='曲阜师范')
print("----------------------")
# 顺序可以随便
print_student_info('彭于晏', college='传媒', age='34')

print("----------------------")


######
# 4. 可变参数
######
# 将参数封装为tuple
def demo(*params):
    print(params)
    print(type(params))


demo(1, 2, 3)  # (1, 2, 3)
# 不传
demo()  # ()

# 如果想把参数封装后传入，也需要用到*
demo(*(4, 5, 6, 7))  # (4, 5, 6, 7)
demo(*[4, 5, 6, 7])  # (4, 5, 6, 7)
# 如果直接传元组，那就是一个参数了，而不是多个参数封装
demo((8, 9, 10))  # ((8, 9, 10),)


######
# 混合参数顺序：必须参数，可变参数，默认参数
######
def demo1(param1, param2=2, *param3):
    print("param1", param1)
    print("param2", param2)
    print("param3", param3)


# 这样打印不出来param2的默认参数
demo1(1, 3, 4, 5)
print("------------")


# 下面这样也不对，默认参数后面不能有必须参数
# demo1(1, param2=2, 3, 4, 5)

# 所以，默认参数需要放到最后
def demo2(param1, *param3, param2=2):
    print("param1", param1)
    print("param2", param2)
    print("param3", param3)


# 这样就起作用了，默认参数
demo2(1, 3, 4, 5)
# 改变默认参数
demo2(1, 3, 4, 5, param2='AAAA')

print("------------")


######
# 遍历可变参数
######
def demo3(*param):
    for i in param:
        print(i, end="|")  # 1|2|3|


demo3(1, 2, 3)

print()
print("------------")
